package com.ruoyi.project.system.task;

import com.ruoyi.project.system.domain.TempDailySchedule;
import com.ruoyi.project.system.domain.TempWeekDaily; // 引入temp_week_daily表实体
import com.ruoyi.project.system.mapper.TempDailyScheduleMapper;
import com.ruoyi.project.system.mapper.TempWeekDailyMapper; // 引入temp_week_daily表Mapper
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Component("dailyScheduleTask") // 保留原Bean名
public class DailyScheduleTask {
    private static final Logger log = LoggerFactory.getLogger(DailyScheduleTask.class);

    @Autowired
    private TempWeekDailyMapper weekDailyMapper; // 核心变更：注入temp_week_daily表Mapper
    @Autowired
    private TempDailyScheduleMapper tempMapper; // 保留原Mapper（操作temp_schedule表）

    // time_id与“星期+上/下午”映射（保留，用于日志说明）
    private static final Map<Integer, String> TIME_ID_MAP = new HashMap<Integer, String>() {{
        put(1, "周一上午");
        put(2, "周一下午");
        put(3, "周二上午");
        put(4, "周二下午");
        put(5, "周三上午");
        put(6, "周三下午");
        put(7, "周四上午");
        put(8, "周四下午");
        put(9, "周五上午");
        put(10, "周五下午");
        put(11, "周六上午");
        put(12, "周六下午");
        put(13, "周日上午");
        put(14, "周日下午");
    }};

    // 正则：截取纯时间（保留原有逻辑）
    private static final Pattern TIME_PATTERN = Pattern.compile("\\b(?:\\d{1,2}:\\d{2}|\\d{1,2})\\s?-\\s?(?:\\d{1,2}:\\d{2}|\\d{1,2})\\b");

    /**
     * 每天0点/12点执行：从temp_week_daily表筛选今日数据 + 区分上下午 → 插入temp_schedule表
     */
    @Scheduled(cron = "0 0 0,12 * * ?")
    @Transactional(rollbackFor = Exception.class)
    public void initDailySchedule() {
        log.info("===== 开始从temp_week_daily表筛选今日值班数据（插入temp_schedule表） =====");
        Calendar calendar = Calendar.getInstance();
        Date today = new Date();
        int hour = calendar.get(Calendar.HOUR_OF_DAY); // 0-23

        // 1. 核心筛选条件：今日日期 + 上/下午（time_id奇数=上午，偶数=下午）
        String todayStr = new java.text.SimpleDateFormat("yyyy-MM-dd").format(today);
        boolean isMorning = hour < 12; // 0-11点=上午，12-23点=下午
        int timeIdParity = isMorning ? 1 : 0; // 1=奇数（上午），0=偶数（下午）
        String periodDesc = isMorning ? "上午" : "下午";

        log.info("筛选条件：日期={} | 时段={} | time_id={}", todayStr, periodDesc, isMorning ? "奇数" : "偶数");

        try {
            // 2. 清空temp_schedule表旧数据
            tempMapper.truncateTempDailySchedule();
            log.info("temp_schedule表已清空旧数据");

            // 3. 从temp_week_daily表查询：今日数据 + 对应时段（time_id奇偶）
            // 核心SQL：筛选datetime为今日，且time_id是奇数/偶数
            List<TempWeekDaily> todayWeekData = weekDailyMapper.selectTodayByTimeIdParity(todayStr, timeIdParity);
            log.info("从temp_week_daily表查询到今日{}值班数据共{}条", periodDesc, todayWeekData.size());

            if (todayWeekData.isEmpty()) {
                log.warn("今日{}无匹配的值班数据，temp_schedule表为空", periodDesc);
                return;
            }

            // 4. 组装temp_schedule表数据（映射temp_week_daily字段到TempDailySchedule实体）
            List<TempDailySchedule> tempList = new ArrayList<>();
            for (TempWeekDaily weekData : todayWeekData) {
                TempDailySchedule temp = new TempDailySchedule();

                // 字段映射：完全从temp_week_daily表获取，无需关联doctor_info
                temp.setDoctor_id(weekData.getDoctorId()); // 医生ID（temp_week_daily.doctor_id）
                temp.setDoctor_name(weekData.getDoctorName()); // 医生姓名（temp_week_daily.doctor_name）
                temp.setDepartment(weekData.getDepartment() != null ? weekData.getDepartment().trim() : "未知科室"); // 科室
                temp.setTitle(weekData.getTitle() != null ? weekData.getTitle().trim() : "未知职称"); // 职称

                // 保留原有逻辑：截取纯时间（如"周四上午 8:00-12:00"→"8:00-12:00"）
                String pureTime = extractPureTime(weekData.getScheduleText());
                temp.setSchedule_text(pureTime); // 纯时间

                temp.setRemaining(weekData.getRemaining() > 0 ? weekData.getRemaining() : 10); // 剩余名额
                temp.setTime_id(weekData.getTimeId()); // 时段ID（来自temp_week_daily.time_id）
                temp.setCurrent_date_(today); // 当前日期（今日）

                // 可选：若temp_schedule有datetime字段，填充精确时间（如2025-11-13 08:00:00）
                // temp.setDatetime(getCurrentDatetime(weekData.getTimeId()));

                tempList.add(temp);
            }

            // 5. 批量插入temp_schedule表
            tempMapper.batchInsertTempDailySchedule(tempList);
            log.info("筛选成功！共{}条今日{}值班记录插入temp_schedule表", tempList.size(), periodDesc);

            // 打印示例数据验证
            tempList.stream().limit(3).forEach(item ->
                log.info("示例：医生={} | 科室={} | 出诊时间={}",
                        item.getDoctor_name(), item.getDepartment(), item.getSchedule_text())
            );

        } catch (Exception e) {
            log.error("从temp_week_daily表筛选插入temp_schedule表失败", e);
            throw new RuntimeException("temp_schedule表数据初始化异常，事务已回滚", e);
        } finally {
            log.info("===== 筛选插入流程结束 =====");
        }
    }

    // 截取纯时间的工具方法（保留原有逻辑）
    private String extractPureTime(String originalSchedule) {
        if (originalSchedule == null || originalSchedule.trim().isEmpty()) {
            return "8:00-18:00";
        }
        Matcher matcher = TIME_PATTERN.matcher(originalSchedule);
        if (matcher.find()) {
            return matcher.group().replaceAll("\\s+", "");
        }
        log.debug("未匹配标准时间格式，返回原始值：{}", originalSchedule);
        return originalSchedule;
    }

    // 可选：生成精确到时分的datetime字段（如需启用，需在TempDailySchedule实体添加datetime字段）
    private Date getCurrentDatetime(int timeId) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, timeId % 2 == 1 ? 8 : 14); // 上午08:00，下午14:00
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }
}